package controller

import (
	"fmt"
	"i18n-template/components"
	"i18n-template/table"
	"i18n-template/utils"
	"io"
	"mime/multipart"
	"os"
	"path/filepath"
	"strings"

	"github.com/gin-gonic/gin"
)

func GenerateFileController() gin.HandlerFunc {
	return func(context *gin.Context) {
		f := table.File{}
		files, _ := context.MultipartForm()
		lng := context.Query("lng")
		fileType := context.Query("type")
		var responseArr []string
		for _, file := range files.File["file"] {
			// 判断上传的文件类型
			basePath := "upload/"
			// 根据文件信息生成uuid
			uuid := utils.GenerateUUID(fmt.Sprintf("%d", file.Size) + file.Filename + lng + fileType)
			// 根据生成了UUID查看服务器
			FindFile, err := f.FindFileByUUID(uuid)
			if err == nil {
				responseArr = append(responseArr, FindFile.URL)
			} else {
				// 获取文件的后缀名
				end := strings.Split(file.Filename, ".")
				// 创建文件
				middlePath := basePath + uuid + "." + end[len(end)-1]
				err = SaveFileController(file, middlePath)
				if err != nil {
					utils.FailResponse(context, "创建文件失败!", err.Error())
					return
				}
				fullPath := "http://i18nport.dongsongkeji.com.cn/" + middlePath
				// fullPath := "http://localhost:60012/" + middlePath
				// 保存文件信息到服务器
				err = f.GenerateFileService(table.File{
					Language: lng,
					UUID:     uuid,
					Filename: file.Filename,
					Filetype: fileType,
					Filesize: file.Size,
					URL:      fullPath,
				})
				if err != nil {
					utils.FailResponse(context, "文件保存到SQL失败", err.Error())
					return
				}
				responseArr = append(responseArr, fullPath)
			}
		}
		utils.SuccessResponse(context, "上传文件成功!", responseArr)

	}
}

// 查询文件
func FindFileController() gin.HandlerFunc {
	return func(context *gin.Context) {
		f := table.File{}
		lng := context.Query("lng")
		fileType := context.Query("type")
		fileName := context.Query("name")
		f.Filetype = fileType
		f.Language = lng
		f.Filename = fileName
		files := f.FindFileByTypeAndLng(f)
		utils.SuccessResponse(context, "查询成功!", files)
	}
}

// 保存文件的处理
func SaveFileController(file *multipart.FileHeader, middlePath string) error {
	createPath, err := os.Create(middlePath)
	fmt.Println("=> 保存图片的路径 = ", middlePath)
	if err != nil {
		return err
	}
	openFile, err := file.Open()
	if err != nil {
		return err
	}
	defer func(openFile multipart.File) {
		_ = openFile.Close()
	}(openFile)
	// 把上传的文件保存到服务器
	_, err = io.Copy(createPath, openFile)
	return err
}

// 删除
func DeleteFileController() gin.HandlerFunc {
	return func(context *gin.Context) {
		var files []table.File
		context.ShouldBind(&files)
		for _, file := range files {
			err := components.DB.Model(&table.File{}).
				Where("uuid = ?", file.UUID).
				Delete(&table.File{}).Error
			if err != nil {
				fmt.Println("=> 删除数据库失败", file.Filename, err.Error())
				utils.FailResponse(context, "删除数据库失败", err.Error())
				return
			}
			glob, _ := filepath.Glob("upload/" + file.UUID + "*")
			err = os.Remove(glob[0])
			if err != nil {
				fmt.Println("=> 删除文件失败", file.Filename, err.Error())
				utils.FailResponse(context, "删除本地文件失败", err.Error())
				return
			}
		}
		utils.SuccessResponse(context, "删除成功!", nil)
	}
}
